www.gusucode.com > LTE基带收发仿真系统matlab源码程序 > LTE baseband simulation/turbo_decoder.m
function decodedBit = turbo_decoder(preDecodeBit,SNRdB) % turbo 解码函数。对输入的三流比特进行尾比特还原,再进行Turbo译码 % 输入:preDecodeBit:译码器输入的软信息 % SNRdB:信噪比 单位dB % 输出:decodedBit:解码后的二进制序列 % % Author: 程式小组(徐萌 张妙 张晓庆) % Date: 2010-07-11 % ========================================================== global LTE_par % 编码生成器 g = [ 1 0 1 1; 1 1 0 1 ]; K = size(g,2); m = K - 1; decodeAlg = LTE_par.UE_par.decodeAlg; % 解码算法 0:Log-Map算法 1:Sova算法 niter = LTE_par.UE_par.niter; % turbo译码迭代次数 lenTotal = length(preDecodeBit); % 变换后信息比特加尾比特长度 lenInfo = lenTotal-4; % 信息比特长度 lenTotal = lenTotal-1; % turbo输出附加3个尾比特后长度 REC1 = zeros(1,2*lenTotal); % 接收端解码器 REC 1输入 REC2 = zeros(1,2*lenTotal); % 接收端解码器 REC 2输入 SNRreal = 10^(0.1*SNRdB); % 得到SNR的真值 preDecodeBit = 0.5*4*SNRreal*preDecodeBit; % 乘以信道置信度值 tailBit = preDecodeBit(:,end-K+1:end); % disp('接收端收到尾比特') % disp(tailBit) tailBit([1 4 2 5 3 6 7 10 8 11 9 12]) = tailBit; tailBit = reshape(tailBit,3,4); % disp('接收端还原尾比特') % disp(tailBit) sysBit = [preDecodeBit(1,1:lenInfo),transpose(tailBit(:,1))]; parityBit = [preDecodeBit(2,1:lenInfo),transpose(tailBit(:,2))]; % 接收端解码器 REC 1输入 系统比特和校验比特交叉放置 REC1(1:2:end) = sysBit; REC1(2:2:end) = parityBit; alphaInternal = internal_leaver_par(lenInfo); % turbo 内交织表 temp = preDecodeBit(alphaInternal); sysBit = [temp,transpose(tailBit(:,3))]; parityBit = [preDecodeBit(3,1:lenInfo),transpose(tailBit(:,4))]; % 接收端解码器 REC 2输入 系统比特和校验比特交叉放置 REC2(1:2:end) = sysBit; REC2(2:2:end) = parityBit; % Initialize extrinsic information L_a = zeros(1,lenTotal); % 先验信息 L_e = zeros(1,lenTotal); % 外信息 tail1 = zeros(1,m); % REC1 的尾比特 tail2 = zeros(1,m); % REC2 的尾比特 for iter = 1:niter % 解码器 1 L_a(alphaInternal) = L_e(1:end-m); % 先验信息 L_a(end-m+1:end) = tail1; if decodeAlg == 0 L_all = logmapo(REC1, g, L_a, 1); % 完整信息 elseif decodeAlg == 1 L_all = max_log_map(REC1, g, L_a, 1); else L_all = sova0(REC1, g, L_a, 1); % 完整信息 end L_e = L_all - 2*REC1(1:2:2*lenTotal) - L_a; % 外信息 % tail1 = L_e(end-m+1:end); % 解码器 2 L_a(1:end-m) = L_e(alphaInternal); % 先验信息 L_a(end-m+1:end) = tail2; if decodeAlg == 0 L_all = logmapo(REC2, g, L_a, 2); % 完整信息 elseif decodeAlg == 1 L_all = max_log_map(REC2, g, L_a, 2); else L_all = sova0(REC2, g, L_a, 2); % 完整信息 end L_e = L_all - 2*REC2(1:2:2*lenTotal) - L_a; % 外信息 % tail2 = L_e(end-m+1:end); end %iter decodedBit(alphaInternal) = (sign(L_all(1:end-m))+1)/2;